package cn.edu.tust.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;

import cn.edu.tust.bean.UserInfoBean;

public class TestDriver {

	public static void main(String[] args) {
		//jdbc数据库连接操作
		//jdbcConn();
		// dbutils进行数据库连接操作
		//dbutilsConn();
		//jdbc数据库连接操作
		//jdbcConn2();
		// dbutils进行数据库查询，结果是list+bean的形式
		dbutilsConn_listBean();
		}
	/**
	 * 使用apache的dbutils进行数据库连接操作
	 */
	private static void dbutilsConn_listBean(){
		try {
			// 1、 创建查询对象 queryrunner
			QueryRunner qr = new QueryRunner(MyDataSource.getDataSource());
			// 2、编写sql语句
			String strSql = "select * FROM tbuserinfo";
			// 3、执行数据库操作，获取结果集
			List<UserInfoBean> lst = (List<UserInfoBean>) qr.query(strSql, new BeanListHandler(UserInfoBean.class));
			System.out.println(lst);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 使用apache的dbutils进行数据库连接操作
	 */
	private static void dbutilsConn(){
		try {
			// 1、 创建查询对象 queryrunner
			QueryRunner qr = new QueryRunner(MyDataSource.getDataSource());
			// 2、编写sql语句
			String strSql = "select * FROM tbuserinfo";
			// 3、执行数据库操作，获取结果集
			List<Map<String, Object>> lst = qr.query(strSql, new MapListHandler());
			System.out.println(lst);
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	/**
	 * 使用jdbc进行数据库连接
	 */
	private static void jdbcConn(){
		// 定义数据库连接串
		String strDbDriver = "com.mysql.jdbc.Driver";
		String strDbUrl = "jdbc:mysql://localhost:3306/dbtust?useUnicode=true&amp;characterEncoding=UTF-8";
		String strUserName = "root";
		String strUserPsw = "root";
		
		try {
			// 1、设置数据库驱动
			Class.forName(strDbDriver);
			// 2、获取数据库连接对象
			Connection conn = DriverManager.getConnection(strDbUrl, strUserName, strUserPsw);
			// 3、从数据库连接对象获取查询对象statement
			Statement st = conn.createStatement();
			// 4、编写sql语句
			String strSql = "select * FROM tbuserinfo";
			// 5、获取数据库查询结果集resultset
			ResultSet rs = st.executeQuery(strSql);
			// 6、遍历resultset获取查询结果内容
			while(rs.next()){
				// 输出resultset中的字段内容
				System.out.println("username："+rs.getString("username"));
				System.out.println("userpsw："+rs.getString("userpsw"));
				System.out.println("-----------------------");
			}
			// 7、关闭资源
			rs.close();
			st.close();
			conn.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 使用jdbc进行数据库连接
	 */
	private static void jdbcConn2(){
		// 定义数据库连接串
		String strDbDriver = "com.mysql.jdbc.Driver";
		String strDbUrl = "jdbc:mysql://localhost:3306/dbtust?useUnicode=true&amp;characterEncoding=UTF-8";
		String strUserName = "root";
		String strUserPsw = "root";
		
		try {
			// 1、设置数据库驱动
			Class.forName(strDbDriver);
			// 2、获取数据库连接对象
			Connection conn = DriverManager.getConnection(strDbUrl, strUserName, strUserPsw);
			// 3、从数据库连接对象获取查询对象statement
			Statement st = conn.createStatement();
			// 4、编写sql语句
			String strSql = "select * FROM tbuserinfo";
			// 5、获取数据库查询结果集resultset
			ResultSet rs = st.executeQuery(strSql);
			// 5.2 将查询结果resultset转换为list+map的数据结构
			List<Map<String, Object>> lst = convertResultSet2ListMap(rs);
			// 6、遍历resultset获取查询结果内容
			System.out.println(lst);
			// 7、关闭资源
			rs.close();
			st.close();
			conn.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 将jdbc查询的结果转换为list+map的形式
	 * @param rs
	 * @return
	 */
	private static List<Map<String, Object>> convertResultSet2ListMap(ResultSet rs){
		// 创建一个List
		List<Map<String,Object>> lst = new ArrayList<>();
		if(rs != null){
			// 遍历resultset结果集，并将其转存到list+map中
			try {
				
				// 获取resultset的列信息
				ResultSetMetaData rsmd = rs.getMetaData();
				//列数
				int cols = rsmd.getColumnCount();
				while(rs.next()){
					// 对于每一行创建一个新的 Map对象
					Map<String,Object> map = new LinkedHashMap<>();
					for(int i =1;i<=cols;i++){
						map.put(rsmd.getColumnName(i), rs.getObject(i));
					}
					// 把保存该列的map放到list中
					lst.add(map);
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}		
		return lst;		
	}
}
